package org.javahispano.javacup.tacticas_aceptadas.jmsaenz;

import java.awt.Color;
import java.util.LinkedList;
import java.util.List;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.EstiloUniforme;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

public class TacticaRCA2009 implements Tactica {

	   Posicion defensa[]=new Posicion[]{
		        new Posicion(0.2595419847328244,-50.41044776119403),
		        new Posicion(-8.321678321678322,-46.56108597285068),
		        new Posicion(0.0,-35.8710407239819),
		        new Posicion(8.797202797202797,-46.56108597285068),
		        new Posicion(11.888111888111888,-32.782805429864254),
		        new Posicion(-13.314685314685315,-33.02036199095023),
		        new Posicion(-23.3006993006993,-13.303167420814479),
		        new Posicion(21.3986013986014,-13.778280542986426),
		        new Posicion(-16.405594405594407,18.054298642533936),
		        new Posicion(0.4755244755244755,-4.276018099547511),
		        new Posicion(12.601398601398602,16.866515837104075)
	    };

	    Posicion ataque[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-8.321678321678322,-46.56108597285068),
	        new Posicion(-0.7132867132867133,-30.6447963800905),
	        new Posicion(8.797202797202797,-46.56108597285068),
	        new Posicion(11.888111888111888,-30.0),
	        new Posicion(-15.216783216783217,-30.0),
	        new Posicion(-21.3986013986014,7.839366515837104),
	        new Posicion(19.496503496503497,7.839366515837104),
	        new Posicion(-14.503496503496503,32.782805429864254),
	        new Posicion(-0.7132867132867133,17.57918552036199),
	        new Posicion(12.601398601398602,33.970588235294116)
	    };

	//
    public Posicion[] getPosicionSaca(SituacionPartido sp) {
        return ataque;
    }

    //
    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    	return defensa;
    }

    //
    //SIEMPRE SUPERIOR ES LO DEL CONTRARIO
    public List<Comando> ejecutar(SituacionPartido sp) {
    	
    	LinkedList<Comando> comandos = new LinkedList<Comando>();
    	
    	if(sp.balon().getY() > 0) {
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, ataque[i]));
            }
    	}
    	else {
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, defensa[i]));
            }
    	}

        //el atacante permanente
        double x = sp.balon().getX();
        if(x > Constantes.penalSup.getX()+12)
        	x = Constantes.penalSup.getX()+12;
        else
        if(x < Constantes.penalSup.getX()-12)
        	x = Constantes.penalSup.getX()-12;
        double y = sp.balon().getY();
        if(y > Constantes.penalSup.getY()+6)
        	y = Constantes.penalSup.getY()+6;
        else
        if(y < Constantes.penalSup.getY()-6)
        	y = Constantes.penalSup.getY()-6;
        comandos.add(new ComandoIrA(9, new Posicion(x, y)));
        comandos.add(new ComandoIrA(10, new Posicion(-x, y)));

        //el arquero y defensores se mueven segun pelota
    	Posicion posIzq = new Posicion(Constantes.posteIzqArcoInf.getX()+1, Constantes.posteIzqArcoInf.getY()+1);
    	Posicion posDer = new Posicion(Constantes.posteDerArcoInf.getX()-1, Constantes.posteDerArcoInf.getY()+1);
    	Posicion posIzqI = new Posicion(Constantes.posteIzqArcoInf.getX()-5, Constantes.posteIzqArcoInf.getY()+5);
    	Posicion posDerI = new Posicion(Constantes.posteIzqArcoInf.getX()+5, Constantes.posteIzqArcoInf.getY()+5);
    	Posicion posIzqD = new Posicion(Constantes.posteDerArcoInf.getX()-5, Constantes.posteDerArcoInf.getY()+5);
    	Posicion posDerD = new Posicion(Constantes.posteDerArcoInf.getX()+5, Constantes.posteDerArcoInf.getY()+5);
        if(sp.balon().getX() > sp.misJugadores()[0].getX()) {  
        	comandos.add(new ComandoIrA(0, posDer));
        	comandos.add(new ComandoIrA(1, posDerI));
        	comandos.add(new ComandoIrA(3, posDerD));
        }
        else {
        	comandos.add(new ComandoIrA(0, posIzq));
        	comandos.add(new ComandoIrA(1, posIzqI));
        	comandos.add(new ComandoIrA(3, posIzqD));
        }
        
        //los mas cercanos a la pelota se acercan
        int[] cercanos = sp.balon().indicesMasCercanos(sp.misJugadores());
        for (int i = 0; i < 3; i++) {
        	int c = cercanos[i];
        	if(c!=9 && c!=0 && c!=1 && c!=3) {
        		comandos.add(new ComandoIrA(c, sp.balon()));
        	}
        }

        //todos los que estan en condiciones de patear patean al arco
        int[] rematan = sp.puedenRematar();
        for (int i : rematan) {
        	Posicion objIzq = new Posicion(Constantes.centroArcoSup.getX()-2, Constantes.centroArcoSup.getY());
        	Posicion objDer = new Posicion(Constantes.centroArcoSup.getX()+2, Constantes.centroArcoSup.getY());

        	Posicion objetivo = sp.misJugadores()[i].getX() < 0 ? objIzq : objDer;
        	
        	double elevada = objetivo.distancia(sp.misJugadores()[i]) < 20 ? 10 : 20;
        	
            comandos.add(new ComandoGolpearBalon(i, objetivo, 1, elevada));
        }
        
        //retorna la lista de comandos.
        return comandos;
    }

    /**********************************************************************************/
        
     /**
     * 
     * @author Jose
     *
     */
    class TacticaDetalleImpl implements TacticaDetalle {

        public String getNombre() {
            return "RCA 2009";
        }

        public String getPais() {
            return "Argentina";
        }

        public String getEntrenador() {
            return "JMSaenz";
        }

        public Color getColorCamiseta() {
            return new Color(0, 204, 255);
        }

        public Color getColorPantalon() {
            return new Color(51, 51, 51);
        }

        public Color getColorFranja() {
            return new Color(255, 255, 255);
        }

        public Color getColorCalcetas() {
            return new Color(0, 102, 102);
        }

        public Color getColorPortero() {
            return new Color(204, 0, 0        );
        }

        public EstiloUniforme getEstilo() {
            return EstiloUniforme.FRANJA_VERTICAL;
        }

        public Color getColorCamiseta2() {
            return new Color(57, 170, 217);
        }

        public Color getColorPantalon2() {
            return new Color(0, 0, 153);
        }

        public Color getColorFranja2() {
            return new Color(71, 44, 133);
        }

        public Color getColorCalcetas2() {
            return new Color(51, 51, 51);
        }

        public Color getColorPortero2() {
            return new Color(231, 137, 199        );
        }

        public EstiloUniforme getEstilo2() {
            return EstiloUniforme.LINEAS_HORIZONTALES;
        }

        /**
         * 
         * @author Jose
         *
         */
        class JugadorImpl implements JugadorDetalle {

            String nombre;
            int numero;
            Color piel, pelo;
            double velocidad, remate, presicion;
            boolean portero;
            Posicion posicion;

            public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                    double velocidad, double remate, double presicion, boolean portero) {
                this.nombre=nombre;
                this.numero=numero;
                this.piel=piel;
                this.pelo=pelo;
                this.velocidad=velocidad;
                this.remate=remate;
                this.presicion=presicion;
                this.portero=portero;
            }

            public String getNombre() {
                return nombre;
            }

            public Color getColorPiel() {
                return piel;
            }

            public Color getColorPelo() {
                return pelo;
            }

            public int getNumero() {
                return numero;
            }

            public boolean esPortero() {
                return portero;
            }

            public double getVelocidad() {
                return velocidad;
            }

            public double getRemate() {
                return remate;
            }

            public double getPresicion() {
                return presicion;
            }

        }

        public JugadorDetalle[] getJugadores() {
            return new JugadorDetalle[]{
                new JugadorImpl("El manco", 1, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.5d, true),
                new JugadorImpl("Jugador", 2, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.5d, false),
                new JugadorImpl("Jugador", 3, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.5d, false),
                new JugadorImpl("Jugador", 4, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,0.5d, false),
                new JugadorImpl("Jugador", 5, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,0.5d, false),
                new JugadorImpl("Jugador", 6, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,0.5d, false),
                new JugadorImpl("Jugador", 7, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,0.5d, false),
                new JugadorImpl("Jugador", 8, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,0.5d, false),
                new JugadorImpl("Jugador", 9, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Jugador", 10, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Jugador", 11, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false)
            };
        }
    }

    TacticaDetalle detalle=new TacticaDetalleImpl();
    public TacticaDetalle getDetalle() {
        return detalle;
    }
}